fda fda.usc    VGAM ggplot2  plotly 
   TRUE    TRUE    TRUE    TRUE    TRUE 

1 Producción de Azúcar

Información del conjunto de datos: azúcar se ha disuelto en agua sin amortiguar y la solución se midió espectrofluorométricamente en una cubeta de 10 \(\times\) 10 \(mm^2\). Los datos en bruto se midieron con un fluorómetro. Para cada muestra, los espectros de emisión se midieron en intervalos de \(0.5\) nm en siete ondas de excitación.

Es decir, tenemos una muestra de tamaño 265, en 571 puntos para cada una de las 7 ondas de longitudes de excitación.

En nuestro caso, decidimos tomar el nivel de excitación correspondiente al nivel de onda 340. Para entender un poco mejor los datos, visualicemos la información sin haberla tratado (i.e. en bruto).

Después de visualizar las funciones (sin suavizar) consideramos como más acertado usar una base de funciones B-Spline para llevar a cabo el suavizado, pues en los datos no se perciben comportamientos cíclicos (o sinusoidales). Como apunte adicional, mencionamos que para llevar a cabo el ajuste nos bastó con usar polinomios de grado 3 (orden 4) y para la parte que presentaba un apuntamiento muy alto usamos más breakpoints.

A continuación podemos ver las versiones suavizadas de la muestra en cuestión.

[1] "done"
done

Para contrastar las estimaciones, vamos a superponer los datos sin tratar, junto con las respectivas curvas suavizadas.

1.1 Función de media

La función de media \(\overline{x(t)}\) se presenta a continuación

1.2 Función de media recortada al 10%

Veremos la media recortada, que corresponde al cálculo de la media despúes de haber omitida una cantidad de observaciones (en este, el 10% de las observaciones menos centrales). Vemos que las funciones menos centrales, parecen mostrar un comportamiento, más apuntados en alguna parte o la parte central en lugar de ser decreciente crece.

1.3 Función de varianza

Se calculó usando todos los datos.

Podemos ver igualmente, una gráfica de una “banda de confianza” (abusamos de términología para orientar la construcción del gráfico, pero no es tal).

1.4 Función de covarianza

Mostramos la superficie obtenida. Con la función persp obtenemos una figura no muy agradable. Sin embargo, usaremos la función plot_ly que graficará la superficie en una página web y tomamos capturas de pantalla.

1.5 La función de mediana

Corresponde a la estimación con la mayor densidad de todas las estimaciones.

1.6 Funciones cuantiles 90% y 95%

En el mismo gráfico presentamos las funciones de los cuantiles solicitados.

1.7 Región central 0.75

1.8 Boxplot funcional y outliers

Los números que aparecen en la leyenda son los identificadores de las funciones \(\widehat{x}\) consideradas como atípicas. En este caso, podemos considerar que se tratan de outliers parciales. Esto lo podemos ver con las observaciones 131, 71 y 10, pues hay una región (intervalo 350-450 aproximadamente) en la que las curvas o bien decrecen de forma muy suave o bien se comportan de forma creciente. En cambio, el comportamiento de los individios 14 y 16 es más complejo de entender porqué son outliers.

Podemos resaltar que los individuos 14 y 16 están entre los 3 elementos con menor profundidad (aproximadamente un 1.2%).

1.9 Boxplot funcional ajustado y outliers

No logramos hacer el cálculo de la matriz de covarianzas robusta y por ende no pudimos presentar la metodología propuesta en las diapositivas.

Como alternativa, proponemos basarnos en técnicas de remuestreo para estimar el boxplot sin usar los que parecen ser datos atípicos y definir el valor del hiperparámetro F.

Los gráficos nos ayudan a ver el efecto de haber cambiado el factor \(F\) de 1.5 a 1.83 y vemos que la proporción de datos catalogados como atípicos cuando no lo son pasa de un 5% a un 2%.

[1] 17 40 55 69 85
[1] 55 69

Mostramos a continuación el boxplot resultante al modificar el factor F.

2 Artículo

2. Leer, comprender y replicar el siguiente artículo: Aguilera, A. M., & Aguilera-Morillo, M. C. (2013). Comparative study of different B-spline approaches for functional data. Mathematical and Computer Modelling, 58(7-8), 1568-1579.

Primero la simulación

se generarn R y theta

ahora la funcion

la simulada

Se genera la funcion simulada

se crea la base

Regression Splines

funcion

se grafica la primera

Generar 100 muestras

Se genera la función

ahora sí las muestras

Smoothing Splines

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

graficar

Se generan 100 muestras

ahora sí las muestras

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

Warning in data.frame(x = seq(0, 1, len = 51), y = predict(ajuste, newdata =
seq(0, : row names were found from a short variable and have been discarded

generar gcv’s

Generar matriz para cada base

obtener funcion media

Graficar boxplot

graficar con 5 bases

graficar con 15 bases

Graficar con 25 bases

se prueba con las 5, 15 y 25 bases de splines

54

[1] "done"
done
LS0tCnRpdGxlOiBUYWxsZXIgXCMgMgphdXRob3I6IAogICAgLSBKdWFuIFNlYmFzdGlhbiBHw7NtZXogRC4KICAgIC0gRGFuaWVsIEZlbGlwZSBDZW5kYWxlcyBHLgpvdXRwdXQ6IAogICAgaHRtbF9ub3RlYm9vazoKICAgICAgICB0b2M6IHRydWUKICAgICAgICB0b2NfZGVwdGg6IDIKICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKLS0tCgpgYGB7ciBDb25maWd1cmFjaW9uZXMgZ2xvYmFsZXMsIGVjaG8gPSBGQUxTRX0KIyBDb25maWd1cmFjaW9uZXMgZ2VuZXJhbGVzCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmdzID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKCiMgQ2FyZ3VlIGRlIGxpYnJlcsOtYXMKYGBgCgpgYGB7cn0KY2FyZ2FfZV9pbnN0YWxhIDwtIGZ1bmN0aW9uKHgpewogICAgbm9faW5zdGFsYWRvcyA8LSAhKHggJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssIDFdKQogICAgaWYoYW55KG5vX2luc3RhbGFkb3MpKXsKICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHhbbm9faW5zdGFsYWRvc10pCiAgICB9CiAgICBzYXBwbHkoeCwgbGlicmFyeSwgbG9naWNhbC5yZXR1cm4gPSBUUlVFLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpCn0KCnBhcXVldGVzIDwtIGMoJ2ZkYScsICdmZGEudXNjJywgJ1ZHQU0nLCAnZ2dwbG90MicsICdwbG90bHknKQpjYXJnYV9lX2luc3RhbGEocGFxdWV0ZXMpCmBgYAoKIyBQcm9kdWNjacOzbiBkZSBBesO6Y2FyIHsudGFic2V0fQoKKipJbmZvcm1hY2nDs24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zOioqIGF6w7pjYXIgc2UgaGEgZGlzdWVsdG8gZW4gYWd1YSBzaW4gYW1vcnRpZ3VhciB5IGxhIHNvbHVjacOzbiBzZSBtaWRpw7MgZXNwZWN0cm9mbHVvcm9tw6l0cmljYW1lbnRlIGVuIHVuYSBjdWJldGEgZGUgMTAgJFx0aW1lcyQgMTAgJG1tXjIkLiBMb3MgZGF0b3MgZW4gYnJ1dG8gc2UgbWlkaWVyb24gY29uIHVuIGZsdW9yw7NtZXRyby4gUGFyYSBjYWRhIG11ZXN0cmEsIGxvcyBlc3BlY3Ryb3MgZGUgZW1pc2nDs24gc2UgbWlkaWVyb24gZW4gaW50ZXJ2YWxvcyBkZSAkMC41JCBubSBlbiBzaWV0ZSBvbmRhcyBkZSBleGNpdGFjacOzbi4KCkVzIGRlY2lyLCB0ZW5lbW9zIHVuYSBtdWVzdHJhIGRlIHRhbWHDsW8gMjY1LCBlbiA1NzEgcHVudG9zIHBhcmEgY2FkYSB1bmEgZGUgbGFzIDcgb25kYXMgZGUgbG9uZ2l0dWRlcyBkZSBleGNpdGFjacOzbi4KCkVuIG51ZXN0cm8gY2FzbywgZGVjaWRpbW9zIHRvbWFyIGVsIG5pdmVsIGRlIGV4Y2l0YWNpw7NuIGNvcnJlc3BvbmRpZW50ZSBhbCBuaXZlbCBkZSBvbmRhIDM0MC4gUGFyYSBlbnRlbmRlciB1biBwb2NvIG1lam9yIGxvcyBkYXRvcywgdmlzdWFsaWNlbW9zIGxhIGluZm9ybWFjacOzbiBzaW4gaGFiZXJsYSB0cmF0YWRvIChpLmUuIGVuIGJydXRvKS4KCmBgYHtyIExlY3R1cmEgZGUgZGF0b3MgeSBDb25maWcuIGluaWNpYWx9CiMgTGVjdHVyYSBkZSBkYXRvcwpydXRhIDwtICcuL0RhdG9zL2RhdG9zLnR4dCcKIyBjb2x1bW5hcyA8LSByZXAoYygnTlVMTCcsICdudW1lcmljJywgJ05VTEwnKSwgCiMgICAgICAgICAgICAgICAgIGMoNTcxICogNSwgNTcxLCA1NzEpKSAgICAgICAgICAgIyBDb2x1bW5hcyBhIGxlZXIKIyBkYXRvcyA8LSByZWFkLnRhYmxlKGZpbGUgPSBydXRhLCBjb2xDbGFzc2VzID0gY29sdW1uYXMpCmRhdG9zMSA8LSByZWFkLnRhYmxlKGNvbENsYXNzZXMgPSByZXAoYygnTlVMTCcsICdudW1lcmljJyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoNiwgMSkqNTcxKSwgZmlsZSA9IHJ1dGEpCgojIEdyw6FmaWNvcwp0X3JhbmdvIDwtIHNlcSgyNzUsIDU2MCwgYnkgPSAwLjUpCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSB0KGRhdG9zMSksIHR5cGUgPSAncCcsIAogICAgICAgIHBjaCA9IDE5LCBjZXggPSAwLjIsIGZyYW1lID0gRkFMU0UsIAogICAgICAgIG1haW4gPSAnRGF0b3Mgb2JzZXJ2YWRvcycsCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScpCmBgYAoKRGVzcHXDqXMgZGUgdmlzdWFsaXphciBsYXMgZnVuY2lvbmVzIChzaW4gc3Vhdml6YXIpIGNvbnNpZGVyYW1vcyBjb21vIG3DoXMgYWNlcnRhZG8gdXNhciB1bmEgYmFzZSBkZSBmdW5jaW9uZXMgKkItU3BsaW5lKiBwYXJhIGxsZXZhciBhIGNhYm8gZWwgc3Vhdml6YWRvLCBwdWVzIGVuIGxvcyBkYXRvcyBubyBzZSBwZXJjaWJlbiBjb21wb3J0YW1pZW50b3MgY8OtY2xpY29zIChvIHNpbnVzb2lkYWxlcykuIENvbW8gYXB1bnRlIGFkaWNpb25hbCwgbWVuY2lvbmFtb3MgcXVlIHBhcmEgbGxldmFyIGEgY2FibyBlbCBhanVzdGUgbm9zIGJhc3TDsyBjb24gdXNhciBwb2xpbm9taW9zIGRlIGdyYWRvIDMgKG9yZGVuIDQpIHkgcGFyYSBsYSBwYXJ0ZSBxdWUgcHJlc2VudGFiYSB1biBhcHVudGFtaWVudG8gbXV5IGFsdG8gdXNhbW9zIG3DoXMgKmJyZWFrcG9pbnRzKi4KCmBgYHtyIENyZWFjacOzbiBkZSBiYXNlfQpsaWJyYXJ5KGZkYSkgICAgICAgICAgICAgICAgICAgICMgTGlicmVyw61hCgojIEJhc2UgcXVlIHNlIHZhIGEgdXNhcgpiayA8LSBjKDI3NSwgMjg1LCAzMDAsIDMyMCwgMzYwLjUsIDM4OSwgNDcwLCA1MjAsIDU2MCkKYmsxIDwtIGMoc2VxKDI3NSwgMzg5LCBieSA9IDI4LjUpLCA0NzAsIDUyMCwgNTYwKQpiYXNlX2JzcCA8LSBjcmVhdGUuYnNwbGluZS5iYXNpcyhicmVha3MgPSBiaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcmRlciA9IDQpCmBgYAoKQSBjb250aW51YWNpw7NuIHBvZGVtb3MgdmVyIGxhcyB2ZXJzaW9uZXMgc3Vhdml6YWRhcyBkZSBsYSBtdWVzdHJhIGVuIGN1ZXN0acOzbi4KCmBgYHtyfQphanVzdGUgPC0gRGF0YTJmZCh5ID0gYXMubWF0cml4KHQoZGF0b3MxKSksIGJhc2lzb2JqID0gYmFzZV9ic3AsIAogICAgICAgICAgICAgICAgICBhcmd2YWxzID0gdF9yYW5nbykKcGxvdChhanVzdGUsIGZyYW1lID0gRkFMU0UsIG1haW4gPSAnQ3VydmFzIFN1YXZpemFkYXMnLCB5bGFiID0gJ0ZsdW9yZXNjZW5jaWEnLAogICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJykKYGBgCgpQYXJhIGNvbnRyYXN0YXIgbGFzIGVzdGltYWNpb25lcywgdmFtb3MgYSBzdXBlcnBvbmVyIGxvcyBkYXRvcyBzaW4gdHJhdGFyLCBqdW50byBjb24gbGFzIHJlc3BlY3RpdmFzIGN1cnZhcyBzdWF2aXphZGFzLgoKYGBge3J9CiMgRGF0b3MgZW4gYnJ1dG8KbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IHQoZGF0b3MxKSwgdHlwZSA9ICdwJywgCiAgICAgICAgcGNoID0gMTksIGNleCA9IDAuMiwgZnJhbWUgPSBGQUxTRSwgCiAgICAgICAgbWFpbiA9ICdNdWVzdHJhcyB5IGN1cnZhcyBzdWF2aXphZGFzIGFzb2NpYWRhcycsIAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnLAogICAgICAgIGNvbCA9ICdibGFjaycpCgojIFJlc3BlY3RpdmFzIGN1cnZhcyBzdWF2aXphZGFzCmxpbmVzKGFqdXN0ZSwgbHdkID0gMC44LCBjb2wgPSAnbWlkbmlnaHRibHVlJykKbGVnZW5kKGxlZ2VuZCA9IGMoJ1NpbiB0cmF0YXInLCAnU3Vhdml6YWRhcycpLCBsd2QgPSAyLCAKICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJ21pZG5pZ2h0Ymx1ZScpLAogICAgICAgeCA9ICd0b3ByaWdodCcsIGJnID0gJ2dyYXk4MicsIGJveC5jb2wgPSAnd2hpdGUnLCAKICAgICAgIGx0eSA9IGMoMSwgMiksIHRleHQuY29sID0gYygnYmxhY2snLCAnbWlkbmlnaHRibHVlJykpCmBgYAoKIyMgRnVuY2nDs24gZGUgbWVkaWEKCkxhIGZ1bmNpw7NuIGRlIG1lZGlhICRcb3ZlcmxpbmV7eCh0KX0kIHNlIHByZXNlbnRhIGEgY29udGludWFjacOzbgoKYGBge3J9CiMgIEV4dHJhZW1vcyBsb3Mgb2JqZXRvcyBhanVzdGFkb3MKYWp1c3RlX2RldGFsbGFkbyA8LSBzbW9vdGguYmFzaXMoYXJndmFscyA9IHRfcmFuZ28sIHkgPSB0KGRhdG9zMSksIGZkUGFyb2JqID0gYmFzZV9ic3ApCgojIEZ1bmNpb25lcyBhanVzdGFkYXMKZl9oYXQgPC0gZXZhbC5mZChldmFsYXJnID0gdF9yYW5nbywgZmRvYmogPSBhanVzdGVfZGV0YWxsYWRvJGZkKQpjb2xuYW1lcyhmX2hhdCkgPC0gcGFzdGUwKCd2JywgMTpuY29sKGZfaGF0KSkKCiMgbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IGZfaGF0LCBjb2wgPSAncmVkJywgbHdkID0gMC41LCBhZGQgPSBUUlVFLCB0eXBlID0gJ2wnKQptYXRwbG90KHggPSB0X3JhbmdvLCB5ID0gdChkYXRvczEpLCB0eXBlID0gJ3AnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ01lZGlhIHkgZGF0b3Mgb3JpZ2luYWxlcycsIAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnLAogICAgICAgIGNvbCA9ICdncmF5JykKCiMgQWdyZWdhbW9zIGxhIGZ1bmNpw7NuIGRlIG1lZGlhCnlfbWVkaWEgPC0gYXBwbHkoWCA9IGZfaGF0LCBNQVJHSU4gPSAxLCBtZWFuKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWEsIGNvbCA9ICdibGFjaycsIGx3ZCA9IDMpCmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gYygnTWVkaWEnLCAnRGF0b3Mgb3JpZ2luYWxlcycpLCBsd2QgPSBjKDMsIE5BKSwgCiAgICAgICBjb2wgPSBjKCdibGFjaycsICdncmF5JyksIGx0eSA9IGMoMSwgTkEpLCBib3guY29sID0gJ3doaXRlJywgCiAgICAgICBwY2ggPSAxOSwgcHQuY2V4ID0gYyhOQSwgMC4yKSkKCiMgQm94cGxvdCBmdW5jaW9uYWwKZmJwbG90KGZpdCA9IGZfaGF0LCB4ID0gdF9yYW5nbywgeWxpbSA9IGMoLTEwLCA1MDApLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgIG1haW4gPSAnQm94cGxvdCBmdW5jaW9uYWwnLCB4bGltID0gcmFuZ2UodF9yYW5nbyksCiAgICAgICBwbG90ID0gRkFMU0UpIC0+IGJwX2Z1bmNpb25hbApvcmRlcihicF9mdW5jaW9uYWwkZGVwdGgpIC0+IGNlbnRyYWxlcwpgYGAKCiMjIEZ1bmNpw7NuIGRlIG1lZGlhIHJlY29ydGFkYSBhbCAxMCUKClZlcmVtb3MgbGEgbWVkaWEgcmVjb3J0YWRhLCBxdWUgY29ycmVzcG9uZGUgYWwgY8OhbGN1bG8gZGUgbGEgbWVkaWEgZGVzcMO6ZXMgZGUgaGFiZXIgb21pdGlkYSB1bmEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyAoZW4gZXN0ZSwgZWwgMTAlIGRlIGxhcyBvYnNlcnZhY2lvbmVzICptZW5vcyBjZW50cmFsZXMqKS4gVmVtb3MgcXVlIGxhcyBmdW5jaW9uZXMgbWVub3MgY2VudHJhbGVzLCBwYXJlY2VuIG1vc3RyYXIgdW4gY29tcG9ydGFtaWVudG8sIG3DoXMgYXB1bnRhZG9zIGVuIGFsZ3VuYSBwYXJ0ZSBvIGxhIHBhcnRlIGNlbnRyYWwgZW4gbHVnYXIgZGUgc2VyIGRlY3JlY2llbnRlIGNyZWNlLgoKYGBge3J9CiMgRGF0b3Mgc2luIHN1YXZpemFyCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdFssIGNlbnRyYWxlc1sxOjI2XV0sIHR5cGUgPSAnbCcsIAogICAgICAgIHBjaCA9IDE5LCBjZXggPSAwLjIsIGZyYW1lID0gRkFMU0UsIGx0eSA9IDEsIGx3ZCA9IDAuOCwKICAgICAgICBjb2wgPSAnY3lhbjInLCBtYWluID0gJ01lZGlhIHJlY29ydGFkYSB5IGRhdG9zIG9yaWdpbmFsZXMnLCAKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykKIyBNZWRpYSByZWNvcnRhZGEKeV9tZWRpYXJlYyA8LSBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MjZdXSwgTUFSR0lOID0gMSwgbWVhbikKCiMgRnVuY2lvbmVzIGdyYWZpY2FkYXMKbGluZXMoeCA9IHRfcmFuZ28sIHkgPSB5X21lZGlhLCBjb2wgPSAnYmxhY2snLCBsd2QgPSAxLCBsdHkgPSAyKQpsaW5lcyh4ID0gdF9yYW5nbywgeSA9IHlfbWVkaWFyZWMsIGx3ZCA9IDEsIGNvbCA9ICdibHVlJykKCiMgSWRlbnRpZmljYW1vcyBjYWRhIGN1cnZhCmxlZ2VuZCh4ID0gJ3RvcHJpZ2h0JywgbGVnZW5kID0gYygnTWVkaWEgcmVjb3J0YWRhJywgJ01lZGlhJywgJ0RhdG9zIG9yaWdpbmFsZXMnKSwgCiAgICAgICBsd2QgPSBjKDEsIDEsIDAuOCksIGNvbCA9IGMoJ2JsdWUnLCAnYmxhY2snLCAnY3lhbjInKSwgCiAgICAgICBsdHkgPSBjKDEsIDIsIDEpLCBib3guY29sID0gJ3doaXRlJykgCiAgICAgICAjcGNoID0gMTksIHB0LmNleCA9IGMoTkEsIE5BLCAwLjIpKQpgYGAKCiMjIEZ1bmNpw7NuIGRlIHZhcmlhbnphCgpTZSBjYWxjdWzDsyB1c2FuZG8gdG9kb3MgbG9zIGRhdG9zLgoKYGBge3J9CiMgRnVuY2nDs24gZGUgdmFyaWFuemEKZl92YXIgPC0gYXBwbHkoWCA9IGZfaGF0LCBNQVIgPSAxLCBGVU4gPSB2YXIpCgojIEdyYWZpY2Ftb3MKcGxvdCh4ID0gdF9yYW5nbywgeSA9IGZfdmFyLCBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ1ZhcmlhbnphIGVzdGltYWRhJywgCiAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB0eXBlID0gJ2wnLCB5bGFiID0gJycpCmBgYAoKUG9kZW1vcyB2ZXIgaWd1YWxtZW50ZSwgdW5hIGdyw6FmaWNhIGRlIHVuYSAiYmFuZGEgZGUgY29uZmlhbnphIiAoYWJ1c2Ftb3MgZGUgdMOpcm1pbm9sb2fDrWEgcGFyYSBvcmllbnRhciBsYSBjb25zdHJ1Y2Npw7NuIGRlbCBncsOhZmljbywgcGVybyBubyBlcyB0YWwpLgoKYGBge3J9CiMgR3LDoWZpY2EgZGUgZGF0b3Mgc2luIHN1YXZpemFyCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSB0KGRhdG9zMSksIHR5cGUgPSAncCcsIAogICAgICAgIHBjaCA9IDE5LCBjZXggPSAwLjIsIGZyYW1lID0gRkFMU0UsIAogICAgICAgIGNvbCA9ICdncmF5JywgbWFpbiA9ICdcIkJhbmRhIGRlIGNvbmZpYW56YVwiJywgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScpCgojIE1lZGlhIHkgYmFuZGFzCmxpbmVzKHggPSB0X3JhbmdvLCB5ID0geV9tZWRpYSwgY29sID0gJ2JsYWNrJywgbHdkID0gMiwgbHR5ID0gMSkKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBjYmluZCh5X21lZGlhIC0gMS45NipzcXJ0KGZfdmFyKSwgeV9tZWRpYSArIDEuOTYqc3FydChmX3ZhcikpLCAKICAgICAgICAgY29sID0gJ2JsdWUnLCBsdHkgPSAxLCBsd2QgPSAyKQpsZWdlbmQoeCA9ICJ0b3ByaWdodCIsIGx0eSA9IDEsIGx3ZCA9IDIsIGNvbCA9IGMoJ2JsdWUnLCAnYmxhY2snKSwgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgbGVnZW5kID0gYygnTWVkaWEnLCAnTMOtbWl0ZXMnKSwgYmcgPSAnZ3JheScpCmBgYAoKIyMgRnVuY2nDs24gZGUgY292YXJpYW56YQoKTW9zdHJhbW9zIGxhIHN1cGVyZmljaWUgb2J0ZW5pZGEuIENvbiBsYSBmdW5jacOzbiAqcGVyc3AqIG9idGVuZW1vcyB1bmEgZmlndXJhIG5vIG11eSBhZ3JhZGFibGUuIFNpbiBlbWJhcmdvLCB1c2FyZW1vcyBsYSBmdW5jacOzbiAqcGxvdF9seSogcXVlIGdyYWZpY2Fyw6EgbGEgc3VwZXJmaWNpZSBlbiB1bmEgcMOhZ2luYSB3ZWIgeSB0b21hbW9zIGNhcHR1cmFzIGRlIHBhbnRhbGxhLgoKYGBge3J9CiMgRnVuY2nDs24gZGUgYXV0b2NvdmFyaWFuemEKY292X2YgPC0gY292KHQoZl9oYXQpKQoKIyBwZXJzcCh4ID0gdF9yYW5nb1tzZXEoMSwgNTcxLCBieSA9IDUpXSwgeSA9IHRfcmFuZ29bc2VxKDEsIDU3MSwgYnkgPSA1KV0sIAojICAgICAgIHogPSB6LCBwaGkgPSAyNSwgdGhldGEgPSA0NCwgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCAKIyAgICAgICB5bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHpsYWIgPSAnY292KHQsIHMpJywgCiMgICAgICAgdGlja3R5cGUgPSAnZGV0YWlsZWQnLCBjb2wgPSAnbGlnaHRibHVlJykKCmcxIDwtIHBsb3RfbHkoeCA9IH50X3JhbmdvLCB5ID0gfnRfcmFuZ28sIHogPSB+Y292X2YsIHNob3dsZWdlbmQgPSBGQUxTRSkKIGcxICU+JSBhZGRfc3VyZmFjZSgpICU+JQogICAgbGF5b3V0KHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRW1pc2nDs24gZXNwZWN0cmFsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAnY292YXJpYW56YScpKSkKYGBgCgojIyBMYSBmdW5jacOzbiBkZSBtZWRpYW5hCgpDb3JyZXNwb25kZSBhIGxhIGVzdGltYWNpw7NuIGNvbiBsYSBtYXlvciBkZW5zaWRhZCBkZSB0b2RhcyBsYXMgZXN0aW1hY2lvbmVzLgoKYGBge3J9CiMgTWVkaWFuYQp5X21lZGlhbmEgPC0gZl9oYXRbLCB3aGljaC5tYXgoYnBfZnVuY2lvbmFsJGRlcHRoKV0KCiMgR3JhZmlxdWVtb3MgbGFzIDMgZnVuY2lvbmVzCm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBjYmluZCh5X21lZGlhcmVjLCB5X21lZGlhLCB5X21lZGlhbmEpLCBsd2QgPSBjKDEsIDEsIDIpLAogICAgICAgIGNvbCA9IGMoJ2JsYWNrJywgJ2JsdWUnLCAnYnJvd24nKSwgdHlwZSA9ICdsJywgZnJhbWUgPSBGQUxTRSwgbHR5ID0gMSwgCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIAogICAgICAgIG1haW4gPSAnTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbCcpCgpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGxlZ2VuZCA9IGMoJ01lZGlhbmEnLCAnTWVkaWEnLCAnTWVkaWEgcmVjb3J0YWRhJyksIAogICAgICAgbHdkID0gYygyLCAxLCAxKSwgY29sID0gYygnYnJvd24nLCAnYmx1ZScsICdibGFjaycpLAogICAgICAgYm94LmNvbCA9ICd3aGl0ZScpCmBgYAoKIyMgRnVuY2lvbmVzIGN1YW50aWxlcyA5MCUgeSA5NSUKCkVuIGVsIG1pc21vIGdyw6FmaWNvIHByZXNlbnRhbW9zIGxhcyBmdW5jaW9uZXMgZGUgbG9zIGN1YW50aWxlcyBzb2xpY2l0YWRvcy4KCmBgYHtyfQojIEdyw6FmaWNvIGRlIGJhc2UKbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IGZfaGF0LCB0eXBlID0gJ2wnLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC4yLCBmcmFtZSA9IEZBTFNFLCAKICAgICAgICBtYWluID0gJ0N1YW50aWxlcycsIGx0eSA9IDEsCiAgICAgICAgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsCiAgICAgICAgY29sID0gJ2dyYXknKQoKY3VhbnRfOTUgPC0gY2JpbmQoYXBwbHkoWCA9IGZfaGF0WywgLWNlbnRyYWxlc1sxOjEzXV0sIE1BUiA9IDEsIG1pbiksIAogICAgICAgICAgICAgICAgICBhcHBseShYID0gZl9oYXRbLCAtY2VudHJhbGVzWzE6MTNdXSwgTUFSID0gMSwgbWF4KSkKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBjdWFudF85NSwgY29sID0gJ2JsdWUnLCBsd2QgPSAzLCBsdHkgPSAxKQoKIyBDdWFudGlsZXMgOTAlCmN1YW50XzkwIDwtIGNiaW5kKGFwcGx5KFggPSBmX2hhdFssIC1jZW50cmFsZXNbMToyNl1dLCBNQVIgPSAxLCBtaW4pLCAKICAgICAgICAgICAgICAgICAgYXBwbHkoWCA9IGZfaGF0WywgLWNlbnRyYWxlc1sxOjI2XV0sIE1BUiA9IDEsIG1heCkpCm1hdGxpbmVzKHggPSB0X3JhbmdvLCB5ID0gY3VhbnRfOTAsIGNvbCA9ICdyZWQnLCBsd2QgPSAyLCBsdHkgPSAxKQpsZWdlbmQoeCA9ICd0b3ByaWdodCcsIGx3ZCA9IDM6MSwgY29sID0gYygnYmx1ZScsICdyZWQnLCAnZ3JheScpLCAKICAgICAgIGxlZ2VuZCA9IGMoJ0N1YW50aWxlcyA5NSUnLCAnQ3VhbnRpbGVzIDkwJScsICdEYXRvcycpLCAKICAgICAgIGJveC5jb2wgPSAnd2hpdGUnKQpgYGAKCiMjIFJlZ2nDs24gY2VudHJhbCAwLjc1CgpgYGB7cn0KIyBCYXNlIDp2Cm1hdHBsb3QoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdCwgdHlwZSA9ICdsJywgcGNoID0gMTksIGNleCA9IDAuMiwgCiAgICAgICAgZnJhbWUgPSBGQUxTRSwgbWFpbiA9ICdSZWdpw7NuIDAuNzUnLCBsdHkgPSAxLAogICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgeWxhYiA9ICdGbHVvcmVzZW5jaWEnLAogICAgICAgIGNvbCA9ICd3aGl0ZScpCmN1YW50Xzc1IDwtIGNiaW5kKGFwcGx5KFggPSBmX2hhdFssIC1jZW50cmFsZXNbMTo2N11dLCBNQVIgPSAxLCBtaW4pLCAKICAgICAgICAgICAgICAgICAgYXBwbHkoWCA9IGZfaGF0WywgLWNlbnRyYWxlc1sxOjY3XV0sIE1BUiA9IDEsIG1heCkpCnBvbHlnb24oeCA9IGModF9yYW5nbywgdF9yYW5nb1tsZW5ndGgodF9yYW5nbyk6MV0pLCAKICAgICAgICB5ID0gYyhjdWFudF83NVssIDFdLCAoY3VhbnRfNzVbLCAyXSlbbGVuZ3RoKHRfcmFuZ28pOjFdKSwgCiAgICAgICAgYm9yZGVyID0gJ21pZG5pZ2h0Ymx1ZScsIGFuZ2xlID0gNDUsIGNvbCA9ICdtaWRuaWdodGJsdWUnLCBkZW5zaXR5ID0gNTApCmBgYAoKIyMgQm94cGxvdCBmdW5jaW9uYWwgeSBvdXRsaWVycwoKTG9zIG7Dum1lcm9zIHF1ZSBhcGFyZWNlbiBlbiBsYSBsZXllbmRhIHNvbiBsb3MgaWRlbnRpZmljYWRvcmVzIGRlIGxhcyBmdW5jaW9uZXMgJFx3aWRlaGF0e3h9JCBjb25zaWRlcmFkYXMgY29tbyBhdMOtcGljYXMuIEVuIGVzdGUgY2FzbywgcG9kZW1vcyBjb25zaWRlcmFyIHF1ZSBzZSB0cmF0YW4gZGUgKm91dGxpZXJzIHBhcmNpYWxlcyouIEVzdG8gbG8gcG9kZW1vcyB2ZXIgY29uIGxhcyBvYnNlcnZhY2lvbmVzIDEzMSwgNzEgeSAxMCwgcHVlcyBoYXkgdW5hIHJlZ2nDs24gIChpbnRlcnZhbG8gMzUwLTQ1MCBhcHJveGltYWRhbWVudGUpIGVuIGxhIHF1ZSBsYXMgY3VydmFzIG8gYmllbiBkZWNyZWNlbiBkZSBmb3JtYSBtdXkgc3VhdmUgbyBiaWVuIHNlIGNvbXBvcnRhbiBkZSBmb3JtYSBjcmVjaWVudGUuIEVuIGNhbWJpbywgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIGluZGl2aWRpb3MgMTQgeSAxNiBlcyBtw6FzIGNvbXBsZWpvIGRlIGVudGVuZGVyIHBvcnF1w6kgc29uICpvdXRsaWVycyouCgpgYGB7cn0KIyBCb3hwbG90IGZ1bmNpb25hbApmYnBsb3QoZml0ID0gZl9oYXQsIHggPSB0X3JhbmdvLCB5bGltID0gYygtMTAsIDUwMCksIAogICAgICAgZnJhbWUgPSBGQUxTRSwgbWFpbiA9ICdCb3hwbG90IGZ1bmNpb25hbCcsIAogICAgICAgeGxpbSA9IHJhbmdlKHRfcmFuZ28pLCBvdXRsaWVyY29sID0gJ3doaXRlJywgCiAgICAgICBiYXJjb2wgPSBhZGp1c3Rjb2xvcignbWlkbmlnaHRibHVlJywgYWxwaGEuZiA9IDAuMiksIAogICAgICAgY29sb3IgPSBhZGp1c3Rjb2xvcignYnJvd24nLCBhbHBoYS5mID0gMC4yKSwKICAgICAgIHhsYWIgPSAnRW1pc2nDs24gZXNwZWN0cmFsJywgCiAgICAgICB5bGFiID0gJ0ZsdW9yZXNlbmNpYScpIC0+IGJwX2Z1bmNpb25hbAptYXRsaW5lcyh4ID0gdF9yYW5nbywgeSA9IGZfaGF0WywgYnBfZnVuY2lvbmFsJG91dHBvaW50XSwgbHR5ID0gYygxLCAyLCAyLCAxLCAxKSwgCiAgICAgICAgIGx3ZCA9IDMsCiAgICAgICAgIGNvbCA9IGMoJ2JsdWU0JywgJ2RlZXBwaW5rNCcsICdpbmRpYW5yZWQ0JywgJ2Nob2NvbGF0ZTQnLCAnZ3JheTE1JykpCmxlZ2VuZChsZWdlbmQgPSBicF9mdW5jaW9uYWwkb3V0cG9pbnQsIHggPSAndG9wcmlnaHQnLCBsd2QgPSAzLAogICAgICAgY29sID0gYygnYmx1ZTQnLCAnZGVlcHBpbms0JywgJ2luZGlhbnJlZDQnLCAnY2hvY29sYXRlNCcsICdncmF5MTUnKSwgCiAgICAgICBuY29sID0gMiwgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgbHR5ID0gYygxLCAyLCAyLCAxLCAxKSwKICAgICAgIGJnID0gJ2F6dXJlMScpCmBgYAoKUG9kZW1vcyByZXNhbHRhciBxdWUgbG9zIGluZGl2aWR1b3MgMTQgeSAxNiBlc3TDoW4gZW50cmUgbG9zIDMgZWxlbWVudG9zIGNvbiBtZW5vciBwcm9mdW5kaWRhZCAoYXByb3hpbWFkYW1lbnRlIHVuIDEuMiUpLgoKIyMgQm94cGxvdCBmdW5jaW9uYWwgYWp1c3RhZG8geSBvdXRsaWVycwoKTm8gbG9ncmFtb3MgaGFjZXIgZWwgY8OhbGN1bG8gZGUgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIHJvYnVzdGEgeSBwb3IgZW5kZSBubyBwdWRpbW9zIHByZXNlbnRhciBsYSBtZXRvZG9sb2fDrWEgcHJvcHVlc3RhIGVuIGxhcyBkaWFwb3NpdGl2YXMuCgpDb21vIGFsdGVybmF0aXZhLCBwcm9wb25lbW9zIGJhc2Fybm9zIGVuIHTDqWNuaWNhcyBkZSByZW11ZXN0cmVvIHBhcmEgZXN0aW1hciBlbCBib3hwbG90IHNpbiB1c2FyIGxvcyBxdWUgcGFyZWNlbiBzZXIgZGF0b3MgYXTDrXBpY29zIHkgZGVmaW5pciBlbCB2YWxvciBkZWwgKmhpcGVycGFyw6FtZXRybyogRi4KCkxvcyBncsOhZmljb3Mgbm9zIGF5dWRhbiBhIHZlciBlbCBlZmVjdG8gZGUgaGFiZXIgY2FtYmlhZG8gZWwgZmFjdG9yICRGJCBkZSAxLjUgYSAxLjgzIHkgdmVtb3MgcXVlIGxhIHByb3BvcmNpw7NuIGRlIGRhdG9zIGNhdGFsb2dhZG9zIGNvbW8gYXTDrXBpY29zIGN1YW5kbyBubyBsbyBzb24gcGFzYSBkZSB1biA1JSBhIHVuIDIlLgoKYGBge3J9CiMgRmlqYW1vcyBzZW1pbGxhCnNldC5zZWVkKDcxOCkKCiMgw41uZGljZXMgc29icmUgbG9zIHF1ZSB2YW1vcyBhIG11ZXN0cmVhcgppbmQgPC0gKDE6bmNvbChmX2hhdCkpWy1icF9mdW5jaW9uYWwkb3V0cG9pbnRdCgojIFJlbXVlc3RyZW8KcmVtIDwtIHNhbXBsZSh4ID0gaW5kLCBzaXplID0gMTAwLCByZXBsYWNlID0gVFJVRSkKCiMgU2VsZWNjacOzbiBkZSBvYnNlcnZhY2lvbmVzCmZfcmVtIDwtIGZfaGF0WywgcmVtXQoKIyBCb3hwbG90CnBhcihtZnJvdyA9IGMoMSwgMikpCmZicGxvdChmX3JlbSwgeCA9IHRfcmFuZ28sIHhsaW0gPSByYW5nZSh0X3JhbmdvKSwgeWxpbSA9IGMoLTUsIDUwMCksIAogICAgICAgZnJhbWUgPSBGQUxTRSwgeGxhYiA9ICdFbWlzacOzbiBlc3BlY3RyYWwnLCBjZXguYXhpcyA9IDAuNywKICAgICAgIGNleC5sYWIgPSAwLjcsCiAgICAgICB5bGFiID0gJ0ZsdW9yZXNlbmNpYScsIG1haW4gPSAnUmVtdWVzdHJlbycpJG91dHBvaW50CiMgY29sbmFtZXMoZl9yZW0pW2MoMTcsIDQwLCA1NSwgNjksIDg1KV0KbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSAnT3V0bGllcnM6IDUlJywgYm94LmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmcgPSAnY3lhbjInLCBjZXggPSAwLjcpCgojIENhbWJpYW1vcyBsb3MgZmFjdG9yZXMKZmJwbG90KGZfcmVtLCB4ID0gdF9yYW5nbywgeGxpbSA9IHJhbmdlKHRfcmFuZ28pLCB5bGltID0gYygtNSwgNTAwKSwgCiAgICAgICBmcmFtZSA9IEZBTFNFLCB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIGZhY3RvciA9IDEuODMsCiAgICAgICBjZXguYXhpcyA9IDAuNywgY2V4LmxhYiA9IDAuNywKICAgICAgIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJywgbWFpbiA9ICdSZWFqdXN0ZSBkZSBmYWN0b3IgRicpJG91dHBvaW50CiMgY29sbmFtZXMoZl9yZW0pW2MoMTcsIDQwLCA1NSwgNjksIDg1KV0KbGVnZW5kKHggPSAndG9wcmlnaHQnLCBsZWdlbmQgPSAnT3V0bGllcnM6IDIlJywgYm94LmNvbCA9ICd3aGl0ZScsCiAgICAgICBiZyA9ICdjeWFuMicsIGNleCA9IDAuNykKYGBgCgpNb3N0cmFtb3MgYSBjb250aW51YWNpw7NuIGVsIGJveHBsb3QgcmVzdWx0YW50ZSBhbCBtb2RpZmljYXIgZWwgZmFjdG9yIEYuCgpgYGB7cn0KIyBCb3hwbG90IGZ1bmNpb25hbApmYnBsb3QoZml0ID0gZl9oYXQsIHggPSB0X3JhbmdvLCB5bGltID0gYygtMTAsIDUwMCksIAogICAgICAgZnJhbWUgPSBGQUxTRSwgbWFpbiA9ICdCb3hwbG90IGZ1bmNpb25hbCBhanVzdGFkbycsIAogICAgICAgeGxpbSA9IHJhbmdlKHRfcmFuZ28pLCBmYWN0b3IgPSAxLjgzLAogICAgICAgb3V0bGllcmNvbCA9ICd3aGl0ZScsIAogICAgICAgYmFyY29sID0gYWRqdXN0Y29sb3IoJ21pZG5pZ2h0Ymx1ZScsIGFscGhhLmYgPSAwLjIpLCAKICAgICAgIGNvbG9yID0gYWRqdXN0Y29sb3IoJ2Jyb3duJywgYWxwaGEuZiA9IDAuMiksCiAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIAogICAgICAgeWxhYiA9ICdGbHVvcmVzZW5jaWEnKSAtPiBicF9mdW5jaW9uYWwKbWF0bGluZXMoeCA9IHRfcmFuZ28sIHkgPSBmX2hhdFssIGJwX2Z1bmNpb25hbCRvdXRwb2ludF0sIGx0eSA9IDEsIAogICAgICAgICBsd2QgPSAzLAogICAgICAgICBjb2wgPSBjKCdibHVlNCcsICdkZWVwcGluazQnLCAnaW5kaWFucmVkNCcsICdjaG9jb2xhdGU0JywgJ2dyYXkxNScpKQpsZWdlbmQobGVnZW5kID0gYnBfZnVuY2lvbmFsJG91dHBvaW50LCB4ID0gJ3RvcHJpZ2h0JywgbHdkID0gMywKICAgICAgIGNvbCA9IGMoJ2JsdWU0JywgJ2RlZXBwaW5rNCcsICdpbmRpYW5yZWQ0JywgJ2Nob2NvbGF0ZTQnLCAnZ3JheTE1JyksIAogICAgICAgY2V4ID0gMC44LCBib3guY29sID0gJ3doaXRlJywgbHR5ID0gMSwKICAgICAgIGJnID0gJ2F6dXJlMScpCmBgYAoKIyBBcnTDrWN1bG8KCioqMi4gTGVlciwgY29tcHJlbmRlciB5IHJlcGxpY2FyIGVsIHNpZ3VpZW50ZSBhcnTDrWN1bG86KioKQWd1aWxlcmEsIEEuIE0uLCAmIEFndWlsZXJhLU1vcmlsbG8sIE0uIEMuICgyMDEzKS4gQ29tcGFyYXRpdmUgc3R1ZHkgb2YKZGlmZmVyZW50IEItc3BsaW5lIGFwcHJvYWNoZXMgZm9yIGZ1bmN0aW9uYWwgZGF0YS4gTWF0aGVtYXRpY2FsIGFuZApDb21wdXRlciBNb2RlbGxpbmcsIDU4KDctOCksIDE1NjgtMTU3OS4KClByaW1lcm8gbGEgc2ltdWxhY2nDs24KCnNlIGdlbmVyYXJuIFIgeSB0aGV0YQoKYGBge3J9ClI8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKdGhldGE8LXJ1bmlmKDEsMCwyKnBpKQpgYGAKCmFob3JhIGxhIGZ1bmNpb24KCmBgYHtyfQoKdHJ1ZV9mdW5jdGlvbnMgPC0gZnVuY3Rpb24oeCl7Uipjb3MoMipwaSp4K3RoZXRhKX0KdHJ1ZV9mdW5jdGlvbnNfMiA8LSBmdW5jdGlvbih4LFJfaW4sdGhldGFfaW4pe1JfaW4qY29zKDIqcGkqeCt0aGV0YV9pbil9CgpgYGAKCmxhIHNpbXVsYWRhCgpgYGB7cn0Kc2ltdWxhdGVkX2Z1bmN0aW9ucyA8LSBmdW5jdGlvbihsZW5naHQub3V0PTUxLFJfaW4sdGhldGFfaW4pewplcnJvcnM8LXJub3JtKGxlbmdodC5vdXQsbWVhbiA9IDAsIHNkPXNxcnQoMC4wNykpCmxlbmdfdGltZT1zZXEoMCwxLGxlbj1sZW5naHQub3V0KQp2YWx1ZXM8LWMoKQpmb3IgKHggaW4gMTpsZW5naHQub3V0KXsKICB2YWx1ZXM8LWFwcGVuZCh2YWx1ZXMsUl9pbipjb3MoMipwaSpsZW5nX3RpbWVbeF0rdGhldGFfaW4pK2Vycm9yc1t4XSkKfQoKcmV0dXJuKHZhbHVlcykKICB9CmBgYApTZSBnZW5lcmEgbGEgZnVuY2lvbiBzaW11bGFkYQoKYGBge3J9CnNpbXVsYXRlZF9jdXJ2ZTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PXNpbXVsYXRlZF9mdW5jdGlvbnMoUl9pbj1SLHRoZXRhX2luPXRoZXRhKSxjYXQ9IlNpbXVsYXRlZCBmdW5jdGlvbiIpCmBgYAoKc2UgY3JlYSBsYSBiYXNlIAoKKipSZWdyZXNzaW9uIFNwbGluZXMqKgpgYGB7cn0KY3JlYXRlX3JlZ3Jlc3Npb248LWZ1bmN0aW9uKG5iYXNpcyxjdXJ2ZSl7CiAgYmFzaXNvYmogPSBjcmVhdGUuYnNwbGluZS5iYXNpcyhjKDAsMSksbmJhc2lzKQogIGFqdXN0ZSA8LSBEYXRhMmZkKHkgPSBjdXJ2ZSR5LCBiYXNpc29iaiA9YmFzaXNvYmosIAogICAgICAgICAgICAgICAgICBhcmd2YWxzID0gc2VxKDAsMSxsZW49NTEpKQogIGRmIDwtIGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSksIHkgPSBwcmVkaWN0KGFqdXN0ZSwgbmV3ZGF0YT1zZXEoMCwxLGxlbj01MSkpLGNhdD1wYXN0ZShhcy5jaGFyYWN0ZXIobmJhc2lzKSwiYmFzaWMga25vdHMiKSkKICByZXR1cm4oZGYpCn0KCnJlZ181PC1jcmVhdGVfcmVncmVzc2lvbig1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzE1PC1jcmVhdGVfcmVncmVzc2lvbigxNSxzaW11bGF0ZWRfY3VydmUpCnJlZ18yNTwtY3JlYXRlX3JlZ3Jlc3Npb24oMjUsc2ltdWxhdGVkX2N1cnZlKQpgYGAKCgpmdW5jaW9uCgoKCnNlIGdyYWZpY2EgbGEgcHJpbWVyYQpgYGB7cn0KZ2dwbG90KGRhdGEuZnJhbWUoeD1jKDAsMSksY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgsY29sb3VyPWNhdCkpICsgc3RhdF9mdW5jdGlvbihmdW49dHJ1ZV9mdW5jdGlvbnMpKyBnZW9tX2xpbmUoZGF0YSA9IHNpbXVsYXRlZF9jdXJ2ZSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfNSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTUsbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjUsbGluZXR5cGUgPSAiZG90ZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkxleWVuZCIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIjUgYmFzaWMga25vdHMiID0gImJsdWUiLCIxNSBiYXNpYyBrbm90cyI9InJlZCIsIjI1IGJhc2ljIGtub3RzIj0iZ3JlZW4iKSkKYGBgCgpHZW5lcmFyIDEwMCBtdWVzdHJhcwoKU2UgZ2VuZXJhIGxhIGZ1bmNpw7NuCgpgYGB7cn0Kc2FtcGxlc19yZWdyZXNzaW9uPC1mdW5jdGlvbihuYmFzaXNfaW4pewogUl9hdXg8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKIHRoZXRhX2F1eDwtcnVuaWYoMSwwLDIqcGkpCiBzaW11bGF0ZWRfY3VydmVfYXV4PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9c2ltdWxhdGVkX2Z1bmN0aW9ucyhSX2luPVJfYXV4LHRoZXRhX2luPXRoZXRhX2F1eCksY2F0PSJTaW11bGF0ZWQgZnVuY3Rpb24iKQogcmV0dXJuKGxpc3QoY3JlYXRlX3JlZ3Jlc3Npb24obmJhc2lzX2luLHNpbXVsYXRlZF9jdXJ2ZV9hdXgpKSkKfQoKYGBgCmFob3JhIHPDrSBsYXMgbXVlc3RyYXMKCmBgYHtyfQpzYW1wbGVzX3JlZ181PC1saXN0KCkKc2FtcGxlc19yZWdfMTU8LWxpc3QoKQpzYW1wbGVzX3JlZ18yNTwtbGlzdCgpCmZvcihpIGluIDE6MTAwKXsKICBzYW1wbGVzX3JlZ181PC1hcHBlbmQoc2FtcGxlc19yZWdfNSxsaXN0KHNhbXBsZXNfcmVncmVzc2lvbig1KSkpCiAgc2FtcGxlc19yZWdfMTU8LWFwcGVuZChzYW1wbGVzX3JlZ18xNSxsaXN0KHNhbXBsZXNfcmVncmVzc2lvbigxNSkpKQogIHNhbXBsZXNfcmVnXzI1PC1hcHBlbmQoc2FtcGxlc19yZWdfMjUsbGlzdChzYW1wbGVzX3JlZ3Jlc3Npb24oMjUpKSkKfQpgYGAKCgoKKipTbW9vdGhpbmcgU3BsaW5lcyoqCgoKYGBge3J9CmNyZWF0ZV9zbV9zcGxpbmVzPC1mdW5jdGlvbihuYmFzaXMsY3VydmUsZD0yLGxhbWJkYT0xMF4oLTIpKXsKICBiYXNpc29iaiA9IGNyZWF0ZS5ic3BsaW5lLmJhc2lzKGMoMCwxKSxuYmFzaXMpCiAgZmRQYXJvYmogPSBmZFBhcihiYXNpc29iaiwgZCwgbGFtYmRhKQogIHNtb290aGxpc3Rub3d0ID0gc21vb3RoLmJhc2lzKHNlcSgwLDEsbGVuPTUxKSwgIGN1cnZlJHksIGZkUGFyb2JqKQogIGFqdXN0ZSA8LSBzbW9vdGhsaXN0bm93dCRmZAogIGRmIDwtIGRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSksIHkgPSBwcmVkaWN0KGFqdXN0ZSwgbmV3ZGF0YT1zZXEoMCwxLGxlbj01MSkpLGNhdD1wYXN0ZShhcy5jaGFyYWN0ZXIobmJhc2lzKSwiYmFzaWMga25vdHMiKSxnY3Y9c21vb3RobGlzdG5vd3QkZ2N2KQogIHJldHVybihkZikKfQoKcmVnXzU8LWNyZWF0ZV9zbV9zcGxpbmVzKDUsc2ltdWxhdGVkX2N1cnZlKQpyZWdfMTU8LWNyZWF0ZV9zbV9zcGxpbmVzKDE1LHNpbXVsYXRlZF9jdXJ2ZSkKcmVnXzI1PC1jcmVhdGVfc21fc3BsaW5lcygyNSxzaW11bGF0ZWRfY3VydmUpCmBgYAoKCmdyYWZpY2FyCgpgYGB7cn0KZ2dwbG90KGRhdGEuZnJhbWUoeD1jKDAsMSksY2F0PSJUcnVlIGZ1bmN0aW9uIiksIGFlcyh4PXgsY29sb3VyPWNhdCkpICsgc3RhdF9mdW5jdGlvbihmdW49dHJ1ZV9mdW5jdGlvbnMpKyBnZW9tX2xpbmUoZGF0YSA9IHNpbXVsYXRlZF9jdXJ2ZSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfNSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMTUsbGluZXR5cGUgPSAibG9uZ2Rhc2giLGFlcyh4PXgseT15LGNvbG91cj1jYXQpKSsgZ2VvbV9saW5lKGRhdGEgPSByZWdfMjUsbGluZXR5cGUgPSAiZG90ZGFzaCIsYWVzKHg9eCx5PXksY29sb3VyPWNhdCkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkxleWVuZCIsIHZhbHVlcyA9IGMoIlRydWUgZnVuY3Rpb24iPSJibGFjayIsIlNpbXVsYXRlZCBmdW5jdGlvbiIgPSAib3JhbmdlIiwgIjUgYmFzaWMga25vdHMiID0gImJsdWUiLCIxNSBiYXNpYyBrbm90cyI9InJlZCIsIjI1IGJhc2ljIGtub3RzIj0iZ3JlZW4iKSkKYGBgCgpTZSBnZW5lcmFuIDEwMCBtdWVzdHJhcwoKYGBge3J9CnNhbXBsZXNfc21vb3RoaW5nPC1mdW5jdGlvbihuYmFzaXNfaW4pewogUl9hdXg8LXJyYXlsZWlnaCgxLCBzY2FsZSA9IHNxcnQoMC4zKSkKIHRoZXRhX2F1eDwtcnVuaWYoMSwwLDIqcGkpCiB0cnVlX2Z1bmNfYXV4PXRydWVfZnVuY3Rpb25zXzIoc2VxKDAsMSxsZW49NTEpLFJfYXV4LHRoZXRhX2F1eCkKIHNpbXVsYXRlZF9jdXJ2ZV9hdXg8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1zaW11bGF0ZWRfZnVuY3Rpb25zKFJfaW49Ul9hdXgsdGhldGFfaW49dGhldGFfYXV4KSxjYXQ9IlNpbXVsYXRlZCBmdW5jdGlvbiIpCiBzbV9hdXg9Y3JlYXRlX3NtX3NwbGluZXMobmJhc2lzX2luLHNpbXVsYXRlZF9jdXJ2ZV9hdXgpCiByZWdfYXV4PWNyZWF0ZV9yZWdyZXNzaW9uKG5iYXNpc19pbixzaW11bGF0ZWRfY3VydmVfYXV4KQogcmV0dXJuKGxpc3QodHJ1ZV9mPXRydWVfZnVuY19hdXgscmVnX3NwbD1yZWdfYXV4JHkseT1zaW11bGF0ZWRfY3VydmVfYXV4JHkseV9oYXQ9c21fYXV4JHksZ2N2PXNtX2F1eCRnY3ZbMV0pKQp9CmBgYAphaG9yYSBzw60gbGFzIG11ZXN0cmFzCgpgYGB7cn0Kc2FtcGxlc19zbW9vdGhfNTwtbGlzdCgpCnNhbXBsZXNfc21vb3RoXzE1PC1saXN0KCkKc2FtcGxlc19zbW9vdGhfMjU8LWxpc3QoKQpmb3IoaSBpbiAxOjEwMCl7CiAgc2FtcGxlc19zbW9vdGhfNTwtYXBwZW5kKHNhbXBsZXNfc21vb3RoXzUsbGlzdChzYW1wbGVzX3Ntb290aGluZyg1KSkpCiAgc2FtcGxlc19zbW9vdGhfMTU8LWFwcGVuZChzYW1wbGVzX3Ntb290aF8xNSxsaXN0KHNhbXBsZXNfc21vb3RoaW5nKDE1KSkpCiAgc2FtcGxlc19zbW9vdGhfMjU8LWFwcGVuZChzYW1wbGVzX3Ntb290aF8yNSxsaXN0KHNhbXBsZXNfc21vb3RoaW5nKDI1KSkpCn0KYGBgCmdlbmVyYXIgZ2N2J3MKCmBgYHtyfQphdXhfYmFzaXNfNTwtYygpCmF1eF9iYXNpc18xNTwtYygpCmF1eF9iYXNpc18yNTwtYygpCmZvcihpIGluIDE6MTAwKXsKICBhdXhfYmFzaXNfNTwtYXBwZW5kKGF1eF9iYXNpc181LHNhbXBsZXNfc21vb3RoXzVbW2ldXSRnY3YpCiAgYXV4X2Jhc2lzXzE1PC1hcHBlbmQoYXV4X2Jhc2lzXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kZ2N2KQogIGF1eF9iYXNpc18yNTwtYXBwZW5kKGF1eF9iYXNpc18yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJGdjdikKfQoKZGZfZ2N2PC1hcy5kYXRhLmZyYW1lKGMoYXV4X2Jhc2lzXzUsYXV4X2Jhc2lzXzE1LGF1eF9iYXNpc18yNSkpCmRmX2djdiRiYXNpczwtYyhyZXAoIjUgYmFzaWMga25vdHMiLDEwMCkscmVwKCIxNSBiYXNpYyBrbm90cyIsMTAwKSxyZXAoIjI1IGJhc2ljIGtub3RzIiwxMDApKQpjb2xuYW1lcyhkZl9nY3YpPC1jKCJ2YWx1ZSIsImJhc2lzIikKCmBgYAoKR2VuZXJhciBtYXRyaXogcGFyYSBjYWRhIGJhc2UKCgpgYGB7cn0KbWF0X2Jhc2lzXzU8LWMoKQptYXRfYmFzaXNfMTU8LWMoKQptYXRfYmFzaXNfMjU8LWMoKQptYXRfYmFzaXNfcmVnXzU8LWMoKQptYXRfYmFzaXNfcmVnXzE1PC1jKCkKbWF0X2Jhc2lzX3JlZ18yNTwtYygpCm1hdF9iYXNpc19zbV81PC1jKCkKbWF0X2Jhc2lzX3NtXzE1PC1jKCkKbWF0X2Jhc2lzX3NtXzI1PC1jKCkKZm9yKGkgaW4gMToxMDApewogIG1hdF9iYXNpc181PC1yYmluZChtYXRfYmFzaXNfNSxzYW1wbGVzX3Ntb290aF81W1tpXV0kdHJ1ZV9mKQogIG1hdF9iYXNpc18xNTwtcmJpbmQobWF0X2Jhc2lzXzE1LHNhbXBsZXNfc21vb3RoXzE1W1tpXV0kdHJ1ZV9mKQogIG1hdF9iYXNpc18yNTwtcmJpbmQobWF0X2Jhc2lzXzI1LHNhbXBsZXNfc21vb3RoXzI1W1tpXV0kdHJ1ZV9mKQogIG1hdF9iYXNpc19yZWdfNTwtcmJpbmQobWF0X2Jhc2lzX3JlZ181LHNhbXBsZXNfc21vb3RoXzVbW2ldXSRyZWdfc3BsKQogIG1hdF9iYXNpc19yZWdfMTU8LXJiaW5kKG1hdF9iYXNpc19yZWdfMTUsc2FtcGxlc19zbW9vdGhfMTVbW2ldXSRyZWdfc3BsKQogIG1hdF9iYXNpc19yZWdfMjU8LXJiaW5kKG1hdF9iYXNpc19yZWdfMjUsc2FtcGxlc19zbW9vdGhfMjVbW2ldXSRyZWdfc3BsKQogIG1hdF9iYXNpc19zbV81PC1yYmluZChtYXRfYmFzaXNfc21fNSxzYW1wbGVzX3Ntb290aF81W1tpXV0keV9oYXQpCiAgbWF0X2Jhc2lzX3NtXzE1PC1yYmluZChtYXRfYmFzaXNfc21fMTUsc2FtcGxlc19zbW9vdGhfMTVbW2ldXSR5X2hhdCkKICBtYXRfYmFzaXNfc21fMjU8LXJiaW5kKG1hdF9iYXNpc19zbV8yNSxzYW1wbGVzX3Ntb290aF8yNVtbaV1dJHlfaGF0KQp9CgpgYGAKCm9idGVuZXIgZnVuY2lvbiBtZWRpYQoKYGBge3J9Cm1lYW5fYmFzaXNfNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gdHJ1ZSBmdW5jdGlvbiIpCm1lYW5fYmFzaXNfMTU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzXzE1LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiB0cnVlIGZ1bmN0aW9uIikKbWVhbl9iYXNpc18yNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfMjUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIHRydWUgZnVuY3Rpb24iKQptZWFuX2Jhc2lzX3JlZ181PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc19yZWdfNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIikKbWVhbl9iYXNpc19yZWdfMTU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3JlZ18xNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIikKbWVhbl9iYXNpc19yZWdfMjU8LWRhdGEuZnJhbWUoeD1zZXEoMCwxLGxlbj01MSkseT1hcHBseShYID0gbWF0X2Jhc2lzX3JlZ18yNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIikKbWVhbl9iYXNpc19zbV81PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc19zbV81LCBNQVJHSU4gPSAyLCBtZWFuKSxjdXJ2YT0iTWVhbiBTbW9vdGhpbmdzIFNwbGluZXMiKQptZWFuX2Jhc2lzX3NtXzE1PC1kYXRhLmZyYW1lKHg9c2VxKDAsMSxsZW49NTEpLHk9YXBwbHkoWCA9IG1hdF9iYXNpc19zbV8xNSwgTUFSR0lOID0gMiwgbWVhbiksY3VydmE9Ik1lYW4gU21vb3RoaW5ncyBTcGxpbmVzIikKbWVhbl9iYXNpc19zbV8yNTwtZGF0YS5mcmFtZSh4PXNlcSgwLDEsbGVuPTUxKSx5PWFwcGx5KFggPSBtYXRfYmFzaXNfc21fMjUsIE1BUkdJTiA9IDIsIG1lYW4pLGN1cnZhPSJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIpCgpgYGAKCgpHcmFmaWNhciBib3hwbG90CgpgYGB7cn0KcDwtZ2dwbG90KGRmX2djdiwgYWVzKHg9YmFzaXMsIHk9dmFsdWUsIGZpbGw9YmFzaXMpKSArCiAgZ2VvbV9ib3hwbG90KCkKcApgYGAKZ3JhZmljYXIgY29uIDUgYmFzZXMKCmBgYHtyfQpnZ3Bsb3QobWVhbl9iYXNpc181LCBhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSArZ2VvbV9saW5lKCkrIGdlb21fbGluZShkYXRhID0gbWVhbl9iYXNpc19yZWdfNSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfc21fNSxsaW5ldHlwZSA9ICJkYXNoZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkxleWVuZCIsIHZhbHVlcyA9IGMoIk1lYW4gdHJ1ZSBmdW5jdGlvbiI9ImJsYWNrIiwiTWVhbiBSZWdyZXNzaW9uIFNwbGluZXMiID0gImdyZWVuIiwgIk1lYW4gU21vb3RoaW5ncyBTcGxpbmVzIiA9ICJibHVlIikpCgoKYGBgCmdyYWZpY2FyIGNvbiAxNSBiYXNlcwpgYGB7cn0KZ2dwbG90KG1lYW5fYmFzaXNfMTUsIGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpICtnZW9tX2xpbmUoKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3JlZ18xNSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfc21fMTUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJMZXllbmQiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJncmVlbiIsICJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIgPSAiYmx1ZSIpKQoKCmBgYAoKR3JhZmljYXIgY29uIDI1IGJhc2VzCgpgYGB7cn0KZ2dwbG90KG1lYW5fYmFzaXNfMjUsIGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpICtnZW9tX2xpbmUoKSsgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX2Jhc2lzX3JlZ18yNSxsaW5ldHlwZSA9ICJkb3R0ZWQiLGFlcyh4PXgseT15LGNvbG91cj1jdXJ2YSkpKyBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fYmFzaXNfc21fMjUsbGluZXR5cGUgPSAiZGFzaGVkIixhZXMoeD14LHk9eSxjb2xvdXI9Y3VydmEpKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJMZXllbmQiLCB2YWx1ZXMgPSBjKCJNZWFuIHRydWUgZnVuY3Rpb24iPSJibGFjayIsIk1lYW4gUmVncmVzc2lvbiBTcGxpbmVzIiA9ICJncmVlbiIsICJNZWFuIFNtb290aGluZ3MgU3BsaW5lcyIgPSAiYmx1ZSIpKQoKCmBgYAoKCmBgYHtyfQojU2UgY2FyZ2FuIGxvcyBkYXRhc2V0cwpkYXRhKHBpbmNoKQp0X3JhbmdvIDwtIHNlcSgwLDEsbGVuZ3RoLm91dD0yMCkKbWF0cGxvdCh4ID0gdF9yYW5nbywgeSA9IHQocGluY2gpLCB0eXBlID0gJ28nLCAKICAgICAgICBwY2ggPSAxOSwgY2V4ID0gMC41LCBmcmFtZSA9IEZBTFNFLCBtYWluID0gJ011ZXN0cmEnLCAKICAgICAgICB4bGFiID0gJ0VtaXNpw7NuIGVzcGVjdHJhbCcsIHlsYWIgPSAnRmx1b3Jlc2VuY2lhJykKYGBgCgpzZSBwcnVlYmEgY29uIGxhcyA1LCAxNSB5IDI1IGJhc2VzIGRlIHNwbGluZXMKYGBge3J9CmJhc2VfYnNwXzUgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYygwLDEpLG5vcmRlciA9IDUpCmJhc2VfYnNwXzE1IDwtIGNyZWF0ZS5ic3BsaW5lLmJhc2lzKGMoMCwxKSxub3JkZXIgPSAxNSkKYmFzZV9ic3BfMjAgPC0gY3JlYXRlLmJzcGxpbmUuYmFzaXMoYygwLDEpLG5vcmRlciA9IDIwKQpwbG90KGJhc2VfYnNwXzIwKSAgICAgICAgICAgICAgICAgICMgVmlzdWFsaXphY2nDs24KYGBgCmBgYHtyfQp5cyA9IHNtb290aC5iYXNpcyhhcmd2YWxzPXRfcmFuZ28sIHk9dChwaW5jaCksIGZkUGFyb2JqPWJhc2VfYnNwXzUpCllzID0gc21vb3RoLmJhc2lzKGFyZ3ZhbHM9dF9yYW5nbywgeT10KHBpbmNoKSwgZmRQYXJvYmo9YmFzZV9ic3BfNSwKICAgICAgICAgICAgICAgICAgcmV0dXJuTWF0cml4PVRSVUUpCmBgYAo1NApgYGB7cn0KYWp1c3RlIDwtIERhdGEyZmQoeSA9IHQocGluY2gpLCBiYXNpc29iaiA9IGJhc2VfYnNwXzUsIAogICAgICAgICAgICAgICAgICBhcmd2YWxzID0gdF9yYW5nbykKcGxvdChhanVzdGUsIGZyYW1lID0gRkFMU0UpCmBgYAoK